package com.turing.post.util;
import javax.ejb.ApplicationException;


import weblogic.transaction.TransactionHelper;

@SuppressWarnings("serial")
@ApplicationException(rollback = true)
public class PCPSApplicationException extends Exception {	
	/**
	 * 错误分类 - 系统原因
	 */
	public static final String ERRCODE_CATEGORY_SYS = "SYS";
	/**
	 * 错误分类 - 空指针
	 */
	public static final String ERRMSG_NULLPOINTER = "空指针";
	public static final String ERRMSG_INVALID_PARMS = "参数无效";

	/**
	 * 错误分类 - 数据库原因
	 */
	public static final String ERRCODE_CATEGORY_DATABASE = "DATABASE";

	/**
	 * 错误分类 - 应用原因
	 */
	public static final String ERRCODE_CATEGORY_APPLICATION = "APPLICATION";

	/**
	 * 主错误分类
	 */
	private String ErrCode_Category = ERRCODE_CATEGORY_SYS;

	public String getErrCodeCategory() {
		return ErrCode_Category;
	}

	public String getSubSysName() {
		return "unknown";
	}

	/**
	 * 子系统错误码
	 */
	private String SubSysErrCode = "";

	public String getSubSysErrCode() {
		return SubSysErrCode;
	}

	/**
	 * 返回子系统错误码简洁描述
	 * 
	 * @return
	 */
	public String getSubSysSysErrCodeDesc() {
		return "unknown";
	};

	/**
	 * 未知的错误详细信息
	 */
	public static final String ERRMSG_UNKNOWN = "unknown error message";

	/**
	 * 详细错误信息
	 */
	private String ErrMsg = ERRMSG_UNKNOWN;

	public String getErrMsg() {
		return ErrMsg;
	}

	protected void setException(String errcode_category, String subsys_errcode,
			String errmsg, boolean isLog) {
		try {
			TransactionHelper.getTransactionHelper().getTransaction().setRollbackOnly();
		} catch (Exception e) {
			PCPSUtil.Log("rollback user transaction", e);
		}
		this.ErrCode_Category = errcode_category;
		this.SubSysErrCode = subsys_errcode;
		this.ErrMsg = errmsg;
		if (isLog) {
			PCPSUtil.Log(errmsg, this);
		}
	}

	/**
	 * POSTApplicationException 异常
	 * 
	 * @param errcode_category
	 *            主错误码
	 * @param subsys_errcode
	 *            子系统错误码
	 * @param errmsg
	 *            错误信息
	 */
	public PCPSApplicationException(String errcode_category,
			String subsys_errcode, String errmsg) {
		setException(errcode_category, subsys_errcode, errmsg, true);
	}

	/**
	 * 数据库异常日志记录
	 * 
	 * @param errcode_category
	 * @param subsys_errcode
	 * @param errmsg
	 * @param isLog
	 *            false 不记录日志
	 */
	public PCPSApplicationException(String errcode_category,
			String subsys_errcode, String errmsg, boolean isLog) {
		setException(errcode_category, subsys_errcode, errmsg, isLog);
	}

	/**
	 * POSTApplicationException 应用异常
	 * 
	 * @param subsys_errcode
	 *            主错误码
	 * @param errmsg
	 *            错误信息
	 */
	public PCPSApplicationException(String subsys_errcode, String errmsg) {
		setException(ERRCODE_CATEGORY_APPLICATION, subsys_errcode, errmsg, true);
	}

	/**
	 * POSTApplicationException 应用异常
	 * 
	 * @param subsys_errcode
	 *            错误信息
	 */
	public PCPSApplicationException(String subsys_errcode) {
		setException(ERRCODE_CATEGORY_APPLICATION, subsys_errcode,
				ERRMSG_UNKNOWN, true);
	}

	public String toString() {
		return String
				.format(
						"POST: Category[%1$s] SubSys[%2$s] SubSysErrCode[%4$s] ErrMsg[%5$s] ",
						getErrCodeCategory(), getSubSysName(),
						getSubSysErrCode(), getSubSysSysErrCodeDesc(),
						getErrMsg());
	}
}
